<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body></body>
<script>
  {
    let a = 0;
    let b = 1;
    console.log(a && b); // 0
    console.log(a || b); // 1
  }

  {
    // && 的短路规则
    let a = 0;
    let b = 1;
    let c = 2;
    console.log(a && b); // 0
    console.log(b && a); // 0

    console.log(b && c); // 2
    console.log(c && b); // 1
    //   等同于

    let VariableOfFn = function (val) {
      console.log("函数被调用");
      return val;
    };

    a = 1;
    if (a === b) VariableOfFn(1); // &&右侧必须包含副效应(赋值、递增、递减或者幻术调用)的表达式
    a === b && VariableOfFn(1); // 只有a ===b时才调用函数，效果与上面一样
  }

  {
    // || 的短路规则
    let [a, b, c] = [0, 1, 2];
    console.info(0 || b); // 1
    console.info(b || 0); // 1
    console.info(b || c); // 1
    console.info(c || b); // 2
  }

  console.log(0 || 100 || 200);

  {
    // ! 操作符会将其操作数转换为布尔值，再将其反转为相反的布尔值
    // ! 操作符始终返回true或false
    // 要取得任何值x对应的布尔值，对其使用两次!!操作符极客
    // ! 操作符作为一元操作符，优先级较高
  }

  {
    // 德摩根定律
    let [q, p] = [0, 1];

    console.log('德摩根定律：', !(p || q) === (!p && !q))

    console.log('德摩根定律：', !(p && q) == (!p || !q))
  }
</script>

</html>